From f6db2e1a79f83046439d4e1ad6619f2b0ad33139 Mon Sep 17 00:00:00 2001 From: robertl Date: Sun, 28 Jun 2009 18:29:44 +0000 Subject: [PATCH] Tobas Kretschmar contirbutes Enigma support, PocketFMS waypoints. --- Makefile.in | 6 +++-- pocketfms_fp.c | 39 ++++++++++++++++++++++++++++---- reference/enigma-gpsb.ert | Bin 0 -> 192 bytes reference/enigma-pfms.ert | Bin 0 -> 192 bytes reference/enigma.gpx | 35 ++++++++++++++++++++++++++++ reference/pocketfms_fp.gpx | 8 +++++++ reference/pocketfms_wp.gpx | 30 ++++++++++++++++++++++++ reference/pocketfms_wp.txt | 4 ++++ testo | 18 ++++++++++++++- vecs.c | 18 +++++++++++++-- xmldoc/formats/enigma_wp.xml | 6 +++++ xmldoc/formats/pocketfms_wp.xml | 6 +++++ 12 files changed, 160 insertions(+), 10 deletions(-) create mode 100755 reference/enigma-gpsb.ert create mode 100755 reference/enigma-pfms.ert create mode 100755 reference/enigma.gpx create mode 100755 reference/pocketfms_wp.gpx create mode 100755 reference/pocketfms_wp.txt create mode 100755 xmldoc/formats/enigma_wp.xml create mode 100755 xmldoc/formats/pocketfms_wp.xml diff --git a/Makefile.in b/Makefile.in index f905aacba..b621f56c9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -61,8 +61,8 @@ ALL_FMTS=$(MINIMAL_FMTS) gtm.o gpsutil.o pcx.o cetus.o copilot.o \ ggv_log.o g7towin.o garmin_gpi.o lmx.o random.o xol.o dg-100.o \ navilink.o mtk_logger.o ik3d.o osm.o destinator.o exif.o vidaone.o \ igo8.o gopal.o humminbird.o mapasia.o gnav_trl.o navitel.o ggv_ovl.o \ - jtr.o sbp.o sbn.o mmo.o skyforce.o itracku.o v900.o \ - pocketfms_bc.o pocketfms_fp.o naviguide.o delbin.o + jtr.o sbp.o sbn.o mmo.o skyforce.o itracku.o v900.o delbin.o \ + pocketfms_bc.o pocketfms_fp.o pocketfms_wp.o naviguide.o enigma.o FMTS=@FMTS@ @@ -763,6 +763,8 @@ skyforce.o: skyforce.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h strptime.h pocketfms_bc.o: pocketfms_bc.c defs.h gbtypes.h pocketfms_fp.o: pocketfms_fp.c defs.h gbtypes.h +pocketfms_wp.o: pocketfms_wp.c defs.h gbtypes.h +enigma.o: enigma.c defs.h gbtypes.h smplrout.o: smplrout.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h filterdefs.h \ grtcirc.h diff --git a/pocketfms_fp.c b/pocketfms_fp.c index 029a7a2c4..f67173686 100755 --- a/pocketfms_fp.c +++ b/pocketfms_fp.c @@ -25,21 +25,24 @@ static int isFirst = 1; static route_head *route = NULL; static waypoint *wpt_to, *wpt_from; +static double dest_altitude; #define MYNAME "PocketFMS FlightPlan" -static xg_callback wpt_s, wpt_from_lat, wpt_from_lon, wpt_from_name; -static xg_callback wpt_e, wpt_to_lat, wpt_to_lon, wpt_to_name, wpt_altitude; +static xg_callback wpt_s, wpt_from_lat, wpt_from_lon, wpt_from_name, wpt_from_elev; +static xg_callback wpt_e, wpt_to_lat, wpt_to_lon, wpt_to_name, wpt_to_elev, wpt_altitude; static xg_tag_mapping gl_map[] = { { wpt_s, cb_start, "/PocketFMSFlightplan/LIB" }, { wpt_from_lat, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/Latitude" }, { wpt_from_lon, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/Longitude" }, + { wpt_from_elev, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/Elevation" }, { wpt_from_name, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/FriendlyShortname" }, { wpt_to_lat, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/Latitude" }, { wpt_to_lon, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/Longitude" }, { wpt_to_name, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/FriendlyShortname" }, - { wpt_altitude, cb_cdata, "/PocketFMSFlightplan/LIB/PlannedAltitude/@Value" }, + { wpt_to_elev, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/Elevation" }, + { wpt_altitude, cb_start, "/PocketFMSFlightplan/LIB/PlannedAltitude" }, { wpt_e, cb_end, "/PocketFMSFlightplan/LIB" }, { NULL, 0, NULL} }; @@ -67,7 +70,10 @@ rd_deinit(void) route->rte_name = xstrdup (head->shortname); route->rte_name = xstrappend(route->rte_name, " - "); if (tail != NULL) + { route->rte_name = xstrappend(route->rte_name, tail->shortname); + tail->altitude = dest_altitude; + } } xml_deinit(); } @@ -122,6 +128,12 @@ void wpt_from_name(const char *args, const char **unused) wpt_from->shortname = xstrappend(wpt_from->shortname, args); } +void wpt_from_elev(const char *args, const char **unused) +{ + if (wpt_from != NULL) + wpt_from->altitude = FEET_TO_METERS(atof(args)); +} + void wpt_to_lat(const char *args, const char **unused) { wpt_to->latitude = atof(args); @@ -137,9 +149,26 @@ void wpt_to_name(const char *args, const char **unused) wpt_to->shortname = xstrappend(wpt_to->shortname, args); } -void wpt_altitude(const char *args, const char **unused) +void wpt_to_elev(const char *args, const char **unused) { - wpt_to->altitude = atof(args); + dest_altitude = FEET_TO_METERS(atof(args)); +} + +void wpt_altitude(const char *args, const char **attrv) +{ + int isFeet = 0; + const char **avp = &attrv[0]; + while (*avp) { + if (0 == strcmp(avp[0], "Value")) { + wpt_to->altitude = atof(avp[1]); + } + if (0 == strcmp(avp[0], "Unit")) { + isFeet = strcmp (avp[1], "ft") == 0 ? 1 : 0; + } + avp += 2; + } + if (isFeet) + wpt_to->altitude = FEET_TO_METERS(wpt_to->altitude); } ff_vecs_t pocketfms_fp_vecs = { diff --git a/reference/enigma-gpsb.ert b/reference/enigma-gpsb.ert new file mode 100755 index 0000000000000000000000000000000000000000..1b11dc64c33604014ffd59d97df0128806e2c342 GIT binary patch literal 192 zcmZ1**v~Ni`qTdrEDQ_`EUup3kqiv1-mXDGKpGnmJ}`k{Z_V@nVo>#dehduk!5)r& ze*QofCaBy!i6M5wyZ>MrHW$YL4OdS#mry4kPprxr*k1K8==1Y1d}0RbU~zTw04n3~ P$WJXx%}dS0G@bzfXRIF^ literal 0 HcmV?d00001 diff --git a/reference/enigma-pfms.ert b/reference/enigma-pfms.ert new file mode 100755 index 0000000000000000000000000000000000000000..50ab8e06926f63c5fd51dee5659265aaa96e50ee GIT binary patch literal 192 zcmZ1**v~Ni`qTdrEDQ{cEUup3kqnPmy$H~Kw!IQ%yKea41FEx(=(>(yF6+S2c literal 0 HcmV?d00001 diff --git a/reference/enigma.gpx b/reference/enigma.gpx new file mode 100755 index 000000000..e1348cc90 --- /dev/null +++ b/reference/enigma.gpx @@ -0,0 +1,35 @@ + + + + + + + 34.137600 + EIKY + KERRY + KERRY + + + 14.020800 + EINN + SHANNON + SHANNON + + + DAP(EI + DUBLIN + DUBLIN + + + 3.048000 + EBHN + Hoevenen + Hoevenen + + + diff --git a/reference/pocketfms_fp.gpx b/reference/pocketfms_fp.gpx index e2e054295..0c72b8d83 100755 --- a/reference/pocketfms_fp.gpx +++ b/reference/pocketfms_fp.gpx @@ -8,21 +8,25 @@ + 237.134400 EDBX EDBX EDBX + 609.600000 Horka,NOL(GM) Horka,NOL(GM) Horka,NOL(GM) + 609.600000 RO(EDBR)-N RO(EDBR)-N RO(EDBR)-N + 609.600000 EDBR EDBR EDBR @@ -31,15 +35,19 @@ EDBX - EDBR PocketFMS flightplan + 237.134400 EDBX + 609.600000 Horka,NOL(GM) + 609.600000 RO(EDBR)-N + 157.581600 EDBR diff --git a/reference/pocketfms_wp.gpx b/reference/pocketfms_wp.gpx new file mode 100755 index 000000000..ec2b8c780 --- /dev/null +++ b/reference/pocketfms_wp.gpx @@ -0,0 +1,30 @@ + + + + + + EDBX + EDBX + EDBX + + + Horka,NOL(GM) + Horka,NOL(GM) + Horka,NOL(GM) + + + RO(EDBR)-N + RO(EDBR)-N + RO(EDBR)-N + + + EDBR + EDBR + EDBR + + diff --git a/reference/pocketfms_wp.txt b/reference/pocketfms_wp.txt new file mode 100755 index 000000000..fe1bc75fb --- /dev/null +++ b/reference/pocketfms_wp.txt @@ -0,0 +1,4 @@ +EDBX 51.158882 14.950277 +Horka,NOL(GM) 51.302700 14.902600 +RO(EDBR)-N 51.343624 14.952033 +EDBR 51.363167 14.950000 diff --git a/testo b/testo index 939bac3bc..2a2ec85af 100755 --- a/testo +++ b/testo @@ -1580,7 +1580,7 @@ compare ${REFERENCE}/skyforce.gpx ${TMPDIR}/skyforce.gpx # # PocketFMS breadcrumb files -#${TMPDIR} +# gpsbabel -i pocketfms_bc -f ${REFERENCE}/pocketfms_bc -o gpx -F ${TMPDIR}/pocketfms_bc.gpx compare ${REFERENCE}/pocketfms_bc.gpx ${TMPDIR}/pocketfms_bc.gpx gpsbabel -i gpx -f ${REFERENCE}/pocketfms_bc.gpx -o pocketfms_bc -F ${TMPDIR}/pocketfms_bc @@ -1592,6 +1592,22 @@ bincompare ${REFERENCE}/pocketfms_bc.babel ${TMPDIR}/pocketfms_bc gpsbabel -i pocketfms_fp -f ${REFERENCE}/pocketfms_fp.xml -o gpx -F ${TMPDIR}/pocketfms_fp.gpx compare ${REFERENCE}/pocketfms_fp.gpx ${TMPDIR}/pocketfms_fp.gpx +# +# PocketFMS waypoints file (.txt) +# +gpsbabel -i gpx -f ${REFERENCE}/pocketfms_fp.gpx -o pocketfms_wp -F ${TMPDIR}/pocketfms_wp.txt +compare ${REFERENCE}/pocketfms_wp.txt ${TMPDIR}/pocketfms_wp.txt +gpsbabel -i pocketfms_wp -f ${REFERENCE}/pocketfms_wp.txt -o gpx -F ${TMPDIR}/pocketfms_wp.gpx +compare ${REFERENCE}/pocketfms_wp.gpx ${TMPDIR}/pocketfms_wp.gpx + +# +# MGL Enigma route file (.ert) +# +gpsbabel -i gpx -f ${REFERENCE}/enigma.gpx -o enigma -F ${TMPDIR}/enigma.ert +compare ${REFERENCE}/enigma-gpsb.ert ${TMPDIR}/enigma.ert +gpsbabel -i enigma -f ${REFERENCE}/enigma-pfms.ert -o gpx -F ${TMPDIR}/enigma.gpx +compare ${REFERENCE}/enigma.gpx ${TMPDIR}/enigma.gpx + # # Columbus/Visiontac V900 "binary" csv files # diff --git a/vecs.c b/vecs.c index 7d369e1bf..d9a0fafb1 100644 --- a/vecs.c +++ b/vecs.c @@ -161,6 +161,8 @@ extern ff_vecs_t skyforce_vecs; extern ff_vecs_t v900_vecs; extern ff_vecs_t pocketfms_bc_vecs; extern ff_vecs_t pocketfms_fp_vecs; +extern ff_vecs_t pocketfms_wp_vecs; +extern ff_vecs_t enigma_vecs; static vecs_t vec_list[] = { @@ -912,8 +914,14 @@ vecs_t vec_list[] = { { &pocketfms_fp_vecs, "pocketfms_fp", - "PocketFMS flightplan", - NULL + "PocketFMS flightplan (.xml)", + "xml" + }, + { + &pocketfms_wp_vecs, + "pocketfms_wp", + "PocketFMS waypoints (.txt)", + "txt" }, { &v900_vecs, @@ -927,6 +935,12 @@ vecs_t vec_list[] = { "Naviguide binary route file (.twl)", "twl" }, + { + &enigma_vecs, + "enigma", + "Enigma binary waypoint file (.ert)", + "ert" + }, { &delbin_vecs, "delbin", diff --git a/xmldoc/formats/enigma_wp.xml b/xmldoc/formats/enigma_wp.xml new file mode 100755 index 000000000..4adcb9d84 --- /dev/null +++ b/xmldoc/formats/enigma_wp.xml @@ -0,0 +1,6 @@ + + The MGL Avionics format holds waypoints or routes. These routes can be loaded by the MGL Stratomaster Enigma EFIS series (Enigma, Odyssey, Voyager, Explorer). + + + The format is designed for microcontrollers. The use is free for any none military application. You can find a detailed description in the MGL Documentation. + diff --git a/xmldoc/formats/pocketfms_wp.xml b/xmldoc/formats/pocketfms_wp.xml new file mode 100755 index 000000000..0f49052e4 --- /dev/null +++ b/xmldoc/formats/pocketfms_wp.xml @@ -0,0 +1,6 @@ + + This format provides support for the PocketFMS user waypoints text file. + + + PocketFMS waypoint text files contain one waypoint per line. Any waypoint has name, latitude and longitude, separated by space. Latitude and longitude are either decimal degrees or degrees°minutes'seconds'' triples. For details see the PocketFMS help file. You can also visit the very friendly PocketFMS forum. + -- 2.30.2